package com.example.base_model.utils

import java.util.Calendar
import kotlin.math.abs

/**
 * @Author jiangKunKun
 * @CreateDate 2025/7/28
 * @Description 时间工具类，提供日期和时间相关的实用方法。
 * @SpittingGrooves
 */
object DateTimeUtils {
    /**
     * 获取指定时间段的开始和结束时间戳。
     *
     * @param type 时间类型："today" (今天), "yesterday" (昨天), "week" (本周), "month" (本月), "year" (本年)。
     * @return [List<Long>]，其中第一个元素是开始时间戳（毫秒），第二个是结束时间戳（毫秒）。
     * @throws IllegalArgumentException 如果传入不支持的时间类型。
     */
    fun getTimeRange(type: String): List<Long> {
        val calendar = Calendar.getInstance()
        val start = Calendar.getInstance()
        val end = Calendar.getInstance()

        when (type.lowercase()) {
            "today" -> {
                // 设置今天开始时间 (00:00:00.000)
                start.set(Calendar.HOUR_OF_DAY, 0)
                start.set(Calendar.MINUTE, 0)
                start.set(Calendar.SECOND, 0)
                start.set(Calendar.MILLISECOND, 0)

                // 设置今天结束时间 (23:59:59.999)
                end.set(Calendar.HOUR_OF_DAY, 23)
                end.set(Calendar.MINUTE, 59)
                end.set(Calendar.SECOND, 59)
                end.set(Calendar.MILLISECOND, 999)
            }
            "yesterday" -> {
                // 将日历设置为昨天
                calendar.add(Calendar.DAY_OF_MONTH, -1)
                // 设置昨天开始时间 (00:00:00.000)
                start.time = calendar.time
                start.set(Calendar.HOUR_OF_DAY, 0)
                start.set(Calendar.MINUTE, 0)
                start.set(Calendar.SECOND, 0)
                start.set(Calendar.MILLISECOND, 0)

                // 设置昨天结束时间 (23:59:59.999)
                end.time = calendar.time
                end.set(Calendar.HOUR_OF_DAY, 23)
                end.set(Calendar.MINUTE, 59)
                end.set(Calendar.SECOND, 59)
                end.set(Calendar.MILLISECOND, 999)
            }
            "week" -> {
                // 设置本周开始时间 (周一 00:00:00.000)
                start.set(Calendar.DAY_OF_WEEK, calendar.firstDayOfWeek)
                start.set(Calendar.HOUR_OF_DAY, 0)
                start.set(Calendar.MINUTE, 0)
                start.set(Calendar.SECOND, 0)
                start.set(Calendar.MILLISECOND, 0)

                // 设置本周结束时间 (周日 23:59:59.999)
                end.time = start.time
                end.add(Calendar.DAY_OF_WEEK, 6) // 添加6天到开始时间，得到周日
                end.set(Calendar.HOUR_OF_DAY, 23)
                end.set(Calendar.MINUTE, 59)
                end.set(Calendar.SECOND, 59)
                end.set(Calendar.MILLISECOND, 999)
            }
            "month" -> {
                // 设置本月开始时间 (1号 00:00:00.000)
                start.set(Calendar.DAY_OF_MONTH, 1)
                start.set(Calendar.HOUR_OF_DAY, 0)
                start.set(Calendar.MINUTE, 0)
                start.set(Calendar.SECOND, 0)
                start.set(Calendar.MILLISECOND, 0)

                // 设置本月结束时间 (月末 23:59:59.999)
                end.time = start.time
                end.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)) // 获取当月最大天数
                end.set(Calendar.HOUR_OF_DAY, 23)
                end.set(Calendar.MINUTE, 59)
                end.set(Calendar.SECOND, 59)
                end.set(Calendar.MILLISECOND, 999)
            }
            "year" -> {
                // 设置本年开始时间 (1月1日 00:00:00.000)
                start.set(Calendar.MONTH, Calendar.JANUARY)
                start.set(Calendar.DAY_OF_MONTH, 1)
                start.set(Calendar.HOUR_OF_DAY, 0)
                start.set(Calendar.MINUTE, 0)
                start.set(Calendar.SECOND, 0)
                start.set(Calendar.MILLISECOND, 0)

                // 设置本年结束时间 (12月31日 23:59:59.999)
                end.time = start.time
                end.set(Calendar.MONTH, Calendar.DECEMBER)
                end.set(Calendar.DAY_OF_MONTH, 31)
                end.set(Calendar.HOUR_OF_DAY, 23)
                end.set(Calendar.MINUTE, 59)
                end.set(Calendar.SECOND, 59)
                end.set(Calendar.MILLISECOND, 999)
            }
            else -> throw IllegalArgumentException("Unsupported time type: $type")
        }

        return listOf(start.timeInMillis, end.timeInMillis)
    }

    /**
     * 将分钟或秒数转换为格式化字符串，例如 "1天02小时30分钟" 或 "05秒"。
     *
     * @param value 分钟数或秒数。
     * @param isSeconds 是否为秒数，默认为 false（表示输入值为分钟数）。
     * @return 格式化的时间字符串。
     */
    fun formatTime(value: Long, isSeconds: Boolean = false): String {
        // 根据 isSeconds 参数决定总秒数
        var totalSeconds = if (isSeconds) value else value * 60

        // 计算天数
        val days = (totalSeconds / (24 * 3600)).toInt()
        totalSeconds %= (24 * 3600)

        // 计算小时数
        val hours = (totalSeconds / 3600).toInt()
        totalSeconds %= 3600

        // 计算分钟数
        val minutes = (totalSeconds / 60).toInt()
        // 计算剩余秒数
        val seconds = (totalSeconds % 60).toInt()

        val sb = StringBuilder()
        if (days > 0) {
            sb.append("${days}天")
        }
        if (hours > 0) {
            // 小时数不足两位时前面补0
            sb.append("${hours.toString().padStart(2, '0')}小时")
        }
        // 注意：这里将 minutes 和 seconds 的格式化字符串也使用了 hours.toString().padStart(2, '0')
        // 这可能是一个逻辑错误，应该是 minutes.toString().padStart(2, '0') 和 seconds.toString().padStart(2, '0')
        // 我将在此处修正，并保持与原始代码的意图一致，即保持两位数格式
        if (minutes > 0) {
            sb.append("${minutes.toString().padStart(2, '0')}分钟") // 修正：应使用 minutes
        }
        if (isSeconds && seconds > 0) {
            sb.append("${seconds.toString().padStart(2, '0')}秒") // 修正：应使用 seconds
        }

        // 如果所有时间单位都为0，根据 isSeconds 返回 "0分钟" 或 "0秒"
        if (sb.isEmpty()) {
            return if (isSeconds) "0秒" else "0分钟"
        }

        return sb.toString()
    }

    /**
     * 计算给定时间戳与当前时间的秒数差的绝对值。
     *
     * @param pastTime 过去的时间戳（毫秒）。
     * @return 相差的秒数（整数）。
     */
    fun getSecondsDiff(pastTime: Long): Int {
        val currentTime = System.currentTimeMillis()
        val diffMillis = abs(currentTime - pastTime) // 计算毫秒差的绝对值
        return (diffMillis / 1000).toInt() // 将毫秒差转换为秒数并取整
    }
}